/**
 * @file hiddenType.h
 * @brief Definisce una struttura che permetta di astrarre i dati
 * dal contesto in cui vengono utilizzati.
 *
 * Nel file vengono definite le strutture e le funzioni per gestirle.
 *
 * @date Mar 16, 2012
 * @author Francesco Corvino
 */

#ifndef HIDDENTYPE_H_
#define HIDDENTYPE_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/**
 * @brief Permette di utilizzare un tipo di dato nascosto e che quindi può variare in base alle necessità.
 *
 * Meccanismo: l'utilizzatore definisce una variabile di questo tipo e assegna un valore al campo hiddentype
 * rappresentate il vero contenuto, cioè quindi i dati necessari per poter interpretare una variabile.
 * Insieme ai dati definisce anche l'interpreter cioè un metodo per poter dare un significato al valore della
 * variabile.
 * Il valore potrebbe cambiare in base al contesto applicativo perciò il metodo interpreter prende due argomenti
 * il primo che è generalmente l'hiddentype stesso e il secondo che rappresenta il contesto.
 *
 * @param hiddentype può essere un puntatore a funzione di qualsiasi forma.
 * @param interpretfnc permette di ottenere un valore valido in base al contesto.
 *
 * @see getHiddenTypeToString esempio di interpreter generalmente utilizzato per ottere le informazioni sui comandi.
 */
typedef struct hiddenType {
	void * hiddentype;
	void * (*interpretfnc)(void*,void*); // primo valore è la stessa hiddentype il secondo è il contesto.
} HiddenType;

void * HiddenType_executeInterpreter(HiddenType* ht, void * context);

char* getHiddenTypeToString(void * value, void * context);

#endif /* HIDDENTYPE_H_ */
